Guava Cache

Google Guava Collections(简称 Guava)是Google推出的Java类库,针对JDK做了很多增强和扩展,例如Map的K-V转换,ConcurrentHashMap的构造等。可以有效使你的代码量更简洁高效。

Guava Cache是一个全内存的本地缓存实现,提供了线程安全的实现机制。Guava Cache本身是一个Map,实现的机制类似ConcurrentHashMap。

官方注解中提出在以下需求中可能会使用到它:

  • automatic loading of entries into the cache
  • least-recently-used eviction when a maximum size is exceeded
  • time-based expiration of entries, measured since last access or last write
  • keys automatically wrapped in WeakReference
  • values automatically wrapped in WeakReference or SoftReference soft
  • notification of evicted (or otherwise removed) entries
  • accumulation of cache access statistics

自动装载,基于时间过期,最少使用排除等,恰好符合最近项目中需要解决一个性能的小问题需求。

Guava提供两种类型缓存:LoadingCache&Cache。LoadingCache可以当entry不存在时加载entry,Cache不会自动加载entry。

private LoadingCache<String, Map> topic_cache_map = CacheBuilder.newBuilder()
        .maximumSize(1000)
        .expireAfterWrite(5, java.util.concurrent.TimeUnit.MINUTES)
        .build(
                new CacheLoader<String, Map>() {
                    public Map load(String key) throws Exception {
                        if("-1".equals(key)) {
                            return getLastTopic();
                        }else{
                            return getTopic(key);
                        }
                    }
                });

设置最大数量1000,五分钟过期时间。 直观的效果体现请参照下图
使用Guava Cache之前
使用前
使用Guava Cache之后
使用后

可以看出反馈时间长的请求数下降了非常的多,响应平均值提高了八倍左右,效果非常理想。
测试参数:10秒内并发1000用户,测试工具采用Gatling,请参照上一篇文章「性能测试神器